import pandas as pd

# 创建DataFrame
df = pd.DataFrame(
    {"语文": [67, 56, 100],
     "数学": [58, 79, 99],
     "英语": [99, 83, 98]},
    index=['张三', '李四', '王五'])

# 排序
# 按数学成绩升序排序
sorted_df_asc = df.sort_values('数学')
print("按数学成绩升序排序:\n", sorted_df_asc)
# 按数学成绩降序排序
sorted_df_desc = df.sort_values('数学', ascending=False)
print("按数学成绩降序排序:\n", sorted_df_desc)

# 重命名列
renamed_df = df.rename(columns={'语文': 'Chinese', '数学': 'Math', '英语': 'English'})
print("重命名列后:\n", renamed_df)

# 排序索引
sorted_index_df = df.sort_index()
print("排序索引后:\n", sorted_index_df)

# 重置索引
reset_index_df = df.reset_index()
print("重置索引后:\n", reset_index_df)

# 重塑数据 - 长格式（melt）
melted_df = pd.melt(df)
print("长格式（melt）后:\n", melted_df)

# 重塑数据 - 宽格式（pivot）
# 假设melted_df是之前melt操作得到的结果
pivoted_df = melted_df.pivot(columns='variable', values='value')
print("宽格式（pivot）后:\n", pivoted_df)

# 连接数据
# 创建两个示例DataFrame
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 按行连接
concatenated_rows = pd.concat([df1, df2])
print("按行连接后:\n", concatenated_rows)
# 按列连接
concatenated_cols = pd.concat([df1, df2], axis=1)
print("按列连接后:\n", concatenated_cols)

# 删除列
dropped_df = df.drop(columns=['英语'])
print("删除英语列后:\n", dropped_df)

# 子集选择 - 行
# 选择第1到2行（索引从0开始）
subset_rows = df.iloc[0:2]
print("选择第1到2行:\n", subset_rows)
# 根据条件选择行
condition_rows = df[df['数学'] > 70]
print("数学成绩大于70的行:\n", condition_rows)

# 子集选择 - 列
# 选择数学和英语列
subset_cols = df[['数学', '英语']]
print("选择数学和英语列:\n", subset_cols)
# 选择数学列
single_col = df['数学']
print("选择数学列:\n", single_col)

# 子集选择 - 行和列
# 选择李四的数学和英语成绩
subset_row_col = df.loc['李四', ['数学', '英语']]
print("选择李四的数学和英语成绩:\n", subset_row_col)

# 访问单个值
# 通过索引访问
single_value_iat = df.iat[1, 1]
print("通过索引访问（李四的数学成绩）:\n", single_value_iat)
# 通过标签访问
single_value_at = df.at['李四', '数学']
print("通过标签访问（李四的数学成绩）:\n", single_value_at)

# 使用query进行过滤
filtered_df = df.query('数学 > 70 and 语文 > 60')
print("使用query过滤后:\n", filtered_df)

# 汇总数据
# 统计语文成绩的每个唯一值的数量
value_counts = df['语文'].value_counts()
print("语文成绩的每个唯一值的数量:\n", value_counts)
# 数据框的行数
num_rows = len(df)
print("数据框的行数:\n", num_rows)
# 数据框的形状
df_shape = df.shape
print("数据框的形状:\n", df_shape)
# 数学列的不同值的数量
num_unique = df['数学'].nunique()
print("数学列的不同值的数量:\n", num_unique)
# 基本描述性统计
describe_df = df.describe()
print("基本描述性统计:\n", describe_df)

# 处理缺失数据
# 创建有缺失值的DataFrame
missing_df = pd.DataFrame({'A': [1, None, 3], 'B': [4, 5, None]})
# 删除有缺失值的行
dropped_missing_df = missing_df.dropna()
print("删除有缺失值的行后:\n", dropped_missing_df)
# 填充缺失值
filled_missing_df = missing_df.fillna(0)
print("填充缺失值后:\n", filled_missing_df)

# 分组数据
# 按语文成绩分组并计算每组的数学成绩均值
grouped_df = df.groupby('语文')['数学'].mean()
print("按语文成绩分组并计算每组的数学成绩均值:\n", grouped_df)

# 窗口操作
# 扩展窗口操作（假设df是数值型数据框，这里以计算累计和为例）
expanding_sum = df.expanding().sum()
print("扩展窗口累计和:\n", expanding_sum)
# 滚动窗口操作（假设窗口大小为2，计算数学成绩的滚动均值）
rolling_mean = df['数学'].rolling(2).mean()
print("滚动窗口大小为2的数学成绩滚动均值:\n", rolling_mean)

# 合并数据集
# 创建两个用于合并的DataFrame
merge_df1 = pd.DataFrame({'ID': ['A', 'B'], 'Value1': [1, 2]})
merge_df2 = pd.DataFrame({'ID': ['A', 'C'], 'Value2': [3, 4]})
# 左连接
left_merge = pd.merge(merge_df1, merge_df2, how='left', on='ID')
print("左连接后:\n", left_merge)
# 右连接
right_merge = pd.merge(merge_df1, merge_df2, how='right', on='ID')
print("右连接后:\n", right_merge)
# 内连接
inner_merge = pd.merge(merge_df1, merge_df2, how='inner', on='ID')
print("内连接后:\n", inner_merge)
# 外连接
outer_merge = pd.merge(merge_df1, merge_df2, how='outer', on='ID')
print("外连接后:\n", outer_merge)
